home *** CD-ROM | disk | FTP | other *** search
Text File | 1995-07-03 | 3.7 KB | 123 lines | [TEXT/MPS ] |
- MODULE Marriage;
-
- IMPORT Clock, Write;
-
- CONST
- n = 8;
- TYPE
- Man = SHORTINT;
- Woman = SHORTINT;
- Rank = SHORTINT;
- VAR
- wmr: ARRAY n+1,n+1 OF Woman;
- mwr: ARRAY n+1,n+1 OF Man;
- rmw: ARRAY n+1,n+1 OF Rank;
- rwm: ARRAY n+1,n+1 OF Rank;
- x: ARRAY n+1 OF Woman;
- y: ARRAY n+1 OF Man;
- single: ARRAY n+1 OF BOOLEAN;
- count: LONGINT;
-
- PROCEDURE SetupMatrices;
- BEGIN
- wmr[1,1]:=7; wmr[1,2]:=2; wmr[1,3]:=6; wmr[1,4]:=5; wmr[1,5]:=1; wmr[1,6]:=3; wmr[1,7]:=8; wmr[1,8]:=4;
- wmr[2,1]:=4; wmr[2,2]:=3; wmr[2,3]:=2; wmr[2,4]:=6; wmr[2,5]:=8; wmr[2,6]:=1; wmr[2,7]:=7; wmr[2,8]:=5;
- wmr[3,1]:=3; wmr[3,2]:=2; wmr[3,3]:=4; wmr[3,4]:=1; wmr[3,5]:=8; wmr[3,6]:=5; wmr[3,7]:=7; wmr[3,8]:=6;
- wmr[4,1]:=3; wmr[4,2]:=8; wmr[4,3]:=4; wmr[4,4]:=2; wmr[4,5]:=5; wmr[4,6]:=6; wmr[4,7]:=7; wmr[4,8]:=1;
- wmr[5,1]:=8; wmr[5,2]:=3; wmr[5,3]:=4; wmr[5,4]:=5; wmr[5,5]:=6; wmr[5,6]:=1; wmr[5,7]:=7; wmr[5,8]:=2;
- wmr[6,1]:=8; wmr[6,2]:=7; wmr[6,3]:=5; wmr[6,4]:=2; wmr[6,5]:=4; wmr[6,6]:=3; wmr[6,7]:=1; wmr[6,8]:=6;
- wmr[7,1]:=2; wmr[7,2]:=4; wmr[7,3]:=6; wmr[7,4]:=3; wmr[7,5]:=1; wmr[7,6]:=7; wmr[7,7]:=5; wmr[7,8]:=8;
- wmr[8,1]:=6; wmr[8,2]:=1; wmr[8,3]:=4; wmr[8,4]:=2; wmr[8,5]:=7; wmr[8,6]:=5; wmr[8,7]:=3; wmr[8,8]:=8;
-
- mwr[1,1]:=4; mwr[1,2]:=6; mwr[1,3]:=2; mwr[1,4]:=5; mwr[1,5]:=8; mwr[1,6]:=1; mwr[1,7]:=3; mwr[1,8]:=7;
- mwr[2,1]:=8; mwr[2,2]:=5; mwr[2,3]:=3; mwr[2,4]:=1; mwr[2,5]:=6; mwr[2,6]:=7; mwr[2,7]:=4; mwr[2,8]:=2;
- mwr[3,1]:=6; mwr[3,2]:=8; mwr[3,3]:=1; mwr[3,4]:=2; mwr[3,5]:=3; mwr[3,6]:=4; mwr[3,7]:=7; mwr[3,8]:=5;
- mwr[4,1]:=3; mwr[4,2]:=2; mwr[4,3]:=4; mwr[4,4]:=7; mwr[4,5]:=6; mwr[4,6]:=8; mwr[4,7]:=5; mwr[4,8]:=1;
- mwr[5,1]:=6; mwr[5,2]:=3; mwr[5,3]:=1; mwr[5,4]:=4; mwr[5,5]:=5; mwr[5,6]:=7; mwr[5,7]:=2; mwr[5,8]:=8;
- mwr[6,1]:=2; mwr[6,2]:=1; mwr[6,3]:=3; mwr[6,4]:=8; mwr[6,5]:=7; mwr[6,6]:=4; mwr[6,7]:=6; mwr[6,8]:=5;
- mwr[7,1]:=3; mwr[7,2]:=5; mwr[7,3]:=7; mwr[7,4]:=2; mwr[7,5]:=4; mwr[7,6]:=1; mwr[7,7]:=8; mwr[7,8]:=6;
- mwr[8,1]:=7; mwr[8,2]:=2; mwr[8,3]:=8; mwr[8,4]:=4; mwr[8,5]:=5; mwr[8,6]:=6; mwr[8,7]:=3; mwr[8,8]:=1;
- END SetupMatrices;
-
- PROCEDURE Print;
- VAR
- m: Man;
- rm, rw: INTEGER;
- BEGIN
- rm:=0; rw:=0;
- FOR m:=1 TO n DO
- (*?? Write.Int(x[m], 4)*); rm:=rm+rmw[m, x[m]]; rw:=rw+rwm[x[m], m]
- END;
- (*?? Write.Int(rm, 8); Write.Int(rw, 4); Write.Ln*)
- END Print;
-
- PROCEDURE Try(m: Man);
- VAR
- r: Rank;
- w: Woman;
-
- PROCEDURE stable(r: Rank; w: Woman; m: Man): BOOLEAN;
- VAR
- pm: Man;
- pw: Woman;
- i, lim: Rank;
- s: BOOLEAN;
- BEGIN
- s:=TRUE; i:=1;
- WHILE (i<r) AND s DO
- pw:=wmr[m,i]; INC(i);
- IF ~single[pw] THEN
- s:=rwm[pw, m]>rwm[pw,y[pw]]
- END
- END;
- i:=1; lim:=rwm[w,m];
- WHILE (i<lim) AND s DO
- pm:=mwr[w,i]; INC(i);
- IF pm<m THEN
- s:=rmw[pm,w]>rmw[pm,x[pm]]
- END
- END;
- RETURN s
- END stable;
-
- BEGIN
- FOR r:=1 TO n DO
- w:=wmr[m,r];
- IF single[w] THEN
- IF stable(r, w, m) THEN
- x[m]:=w; y[w]:=m; single[w]:=FALSE;
- IF m<n THEN
- Try(m+1)
- ELSE
- Print
- END;
- single[w]:=TRUE
- END
- END
- END
- END Try;
-
- PROCEDURE Search;
- VAR
- m: Man;
- w: Woman;
- r: Rank;
- BEGIN
- FOR m:=1 TO n DO
- FOR r:=1 TO n DO rmw[m,wmr[m,r]]:=r END
- END;
- FOR w:=1 TO n DO
- FOR r:=1 TO n DO rwm[w,mwr[w,r]]:=r END
- END;
- FOR w:=1 TO n DO single[w]:=TRUE END;
- Try(1)
- END Search;
-
- (*$MAIN+*)
- BEGIN
- SetupMatrices; Clock.Start; count:=1;
- REPEAT
- Search; count:=count+1
- UNTIL count>50;
- Write.Int(Clock.Stop() DIV 1000, 1)
- END Marriage.